在透過bpf(BPF_PROG_LOAD, ...)
system call將eBPF程式載入內核的過程(可以參考原始碼),會替該eBPF程式建立struct bpf_prog
結構,其中prog->aux->refcnt
計數器記錄了該eBPF程式的參考數量,載入的時候會透過atomic64_set(&prog->aux->refcnt, 1);
將refcnt設置為一,並返為對應的file descriptor。
當refcnt降為0的時候,就會觸發unload,將eBPF程式資源給釋放掉。(原始碼)
因此如果呼叫BPF_PROG_LOAD
的程式沒有進一步操作,並直接結束的話,當file descriptor被release,就會觸發refcnt--,而變成0並移除eBPF程式。
要增加eBPF程式refcnf大致上有幾種方式
/sys/fs/bpf/
路徑下的指定位置,並透過open
的方式直接取得file descriptor。PIN同樣會增加refcnt,因此PIN住的程式不會被回收透過以上的操作都會增加refcnt,相反的,對應的資源釋放則會減少refcnt。因此只要確保有任何一個eBPF程式的參考存在,即可保證eBPF程式一直存在kernel內。
本系列30天鐵人文章同步發表在我的個人部落格